﻿package com.jalheart.utils{
	import	flash.utils.Timer;
	
	import	flash.events.*;
	public	class	Cronometro extends EventDispatcher{
		public	static	const	PROGRESIVO		:	String	=	"progresivo";
		public	static	const	REGRESIVO		:	String	=	"retroactivo";
		public	static	const	INTERMEDIO		:	String	=	"intermedio";
		public	static	const	TERMINAR			:	String	=	"terminar";

		private	var	_tiempoLimite			:	int			=	-1;
		private	var	_intermedios				:	int			=	-1;
		private	var	_tipo							:	String	=	PROGRESIVO;
		private	var	_elTiempo					:	uint		=	0;
		private	var	_temporizador			:	Timer	=	new	Timer(100);
		private	var	_tiempoActual			:	Number	=	0;
		
		private	var	_despachado				:	Boolean	=	false;
		
		public	function	Cronometro(clase:String=PROGRESIVO,tLimite:int=-1,interm:int=-1)
		{
			tipo				=	clase;
			tiempoLimite	=	tLimite;
			intermedios	=	interm;
			_temporizador.addEventListener(TimerEvent.TIMER,alTiempo);
		}
		public	function	iniciar():void
		{
			var	tiempo:Date=new Date();
			_tiempoActual	=	tiempo.time;
			_temporizador.start();
		}
		public	function	detener():void
		{
			_temporizador.stop();
		}
		public	function	set	tipo(valor:String):void
		{
			_tipo	=	valor;
			if(valor==REGRESIVO&&tiempoLimite<=0)
				tiempoLimite	=	60;
		}
		private	function	alTiempo(e:Event):void
		{
			var	hora		:	Date	=	new	Date();
			var	tiempo	:	uint	=	(hora.time-_tiempoActual);
//			trace(tiempo%(intermedios*1000))
			if(intermedios>0)
				if(tiempo%(intermedios*1000)<=500)
				{
					if(!_despachado)
					{
						this.dispatchEvent(new	Event(INTERMEDIO));
						_despachado	=	true;	
					}
				}else
				{
					_despachado	=	false;
				}
			if((tipo==PROGRESIVO)&&(tiempoLimite>=0)&&(tiempo>=tiempoLimite))
			{
				this.dispatchEvent(new Event(TERMINAR));
				_temporizador.stop();
			}
			else if((tipo==REGRESIVO)&&(tiempoLimite-tiempo<=0))
			{
				this.dispatchEvent(new Event(TERMINAR));
				_temporizador.stop();
			}
		}
		public	function	get	tipo():String
		{
			return	_tipo;
		}
		public	function	set	tiempoLimite(valor:int):void
		{
			_tiempoLimite	=	valor;
		}
		public	function	get	tiempoLimite():int
		{
			return	_tiempoLimite;
		}
		public	function	set	intermedios(valor:int):void
		{
			_intermedios	=	valor;
		}
		public	function	get	intermedios():int
		{
			return	_intermedios;
		}
		public	function	get	elTiempo():uint
		{
			var	hora		:	Date	=	new	Date();
			var	tiempo	:	uint	=	(hora.time-_tiempoActual)/1000;
			var	salida:uint=0;
			
			if(tipo==PROGRESIVO)
				salida	=	tiempo
			else
				salida	=	tiempoLimite-tiempo;
			return	salida;
		}
	}
}